https://leetcode.cn/problems/rotate-array/description/
C语言：
//1:使用新的数组
/*
void rotate(int* nums, int numsSize, int k) {
    int new_nums[numsSize];
    for(int i = 0; i < numsSize;  i++)
    {
        new_nums[(i + k) % numsSize] = nums[i];
        //将nums数组的前面的数字放到第k个位置
        //然后当i+k == numssize的时候刚好nums的第k个数字放到了new_nums的第一个位置
    } 
    //拷贝还原数组
    for(int j = 0; j < numsSize; j++)
    {
        nums[j] = new_nums[j];
    }
}
*/
//2:原地翻转数组
void swap(int* a, int* b) {
    int t = *a;
    *a = *b, *b = t;
}
void reverse(int *nums,int left, int right)
{
    while(left < right)
    {
        swap(&nums[left], &nums[right]);
        left++;
        right--;
    }
}
void rotate(int* nums, int numsSize, int k) {
    //避免k>numsSizse
    k %= numsSize;
    //1：先翻转整个数组
    reverse(nums,0,numsSize-1);
    //翻转前K个元素
    reverse(nums,0,k-1);//k-1是因为下标从0开始，而且注意考虑开区间和闭区间的关系
    //翻转后面的n-k个元素
    reverse(nums,k,numsSize-1);
}

////////////////////
C++
// 1:使用新的数组
// class Solution {
// public:
//     void rotate(vector<int>& nums, int k) {
//         int n = nums.size();
//         vector<int> v(n);
//         for(int i = 0; i < n; i++)
//         {
//             v[(i+k)%n] = nums[i];
//         }
//         nums.assign(v.begin(),v.end());
//     }
// };

//2:原地翻转数组
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k%=nums.size();
        reverse(nums.begin(),nums.end());
        reverse(nums.begin(),nums.begin()+k);
        reverse(nums.begin() + k,nums.end());
    }
};
